// #include <iostream>
// #include<string>
// #include<vector>
// #include<memory>
// #include<new>
//
// using namespace std;
//
// //shared_ptr
//
// void free_file(FILE* fp)
// {
//     fclose(fp);
//     cout << "文件释放成功" << endl;
// }
//
// class MM
// {
// public:
//     MM()
//     {
//         cout << "构建无参对象" << endl;
//     }
//     MM(int age)
//     {
//         cout << "MM" << endl;
//     }
//     ~MM()
//     {
//         cout << "~MM" << endl;
//     }
//     int get_age() const
//     {
//         return 1;
//     }
// protected:
// };
//
// //共享型
// void test_shared_ptr()
// {
//     //基本操作
//     //创建和访问数据
//     // shared_ptr<int> pint(new int(123));
//     // if (!pint)
//     // {
//     //     cout << "初始化失败" << endl;
//     // }else
//     // {
//     //     //把智能指针对象 当做原生对象
//     //     cout <<"访问数据" << *pint << endl;
//     //     //不能取下标0运算
//     //
//     //     //原生指针
//     //     int* p = pint.get();
//     //     cout << "访问数据" << p[0] << endl;
//     //     //delete p 不能写释放 会导致二次释放
//     //
//     //     cout << "cout" << pint.use_count() << endl;
//     //
//     //     //支撑拷贝构造
//     //     shared_ptr<int> p2 = pint;
//     //     cout << "cout" << pint.use_count() << endl;
//     //     cout << "cout" << p2.use_count() << endl;
//     //
//     //     shared_ptr<MM> pmm(new MM(1));
//     //     cout << pmm->get_age() << endl;
//     //     cout << pmm.use_count() << endl;
//     //
//     //     //这个参数是根据类的构造函数来的 make_shared构建智能指针
//     //     shared_ptr<MM> pmm2 = make_shared<MM>(1);
//     //
//     //
//     // }
//     //管理特殊内存 需要自己手动写删除器（释放内存的函数）
//
//     //33:00
//     shared_ptr<MM> parr(new MM[4],[](MM* p){ delete[] p;});
//
//
//     shared_ptr<FILE> fp(fopen("1.txt","w+"),free_file);
//     {
//         cout<< "=============" << endl;
//         vector<shared_ptr<MM>> value;
//         value.push_back(shared_ptr<MM>(new MM(1)));
//         value.push_back(shared_ptr<MM>(new MM(2)));
//         value.push_back(shared_ptr<MM>(new MM(3)));
//     }
// }
//
// int main()
// {
//     test_shared_ptr();
//     return 0;
// }